/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package 节点流.字符流;

import org.junit.Test;

import java.io.*;

/**
 * @Description FileReader、Writer
 * 节点流之一
 * 此流不能处理文本之外的文件
 * @Author 俊昭
 * @Date 2022/4/24
 */
public class FileReaderWriterTest {
    public static void main(String[] args) {
        File f1 = new File("C:\\Users\\Junzhao\\IOStream\\字符流\\FileWriter.txt");
        File f2 = new File("C:\\Users\\Junzhao\\IOStream\\新建文件夹");

        FileWriterReaderCopy(f1, f2);
//        // 得到JVM中的空闲内存量（单位是m）
//        System.out.println(Runtime.getRuntime().freeMemory()/1024/1024);
//        // 的JVM内存总量（单位是m）
//        System.out.println(Runtime.getRuntime().totalMemory()/1024/1024);
//        // JVM试图使用额最大内存量（单位是m）
//        System.out.println(Runtime.getRuntime().maxMemory()/1024/1024);
//        // 可用处理器的数目
//        System.out.println(Runtime.getRuntime().availableProcessors());
    }

    /**
     * @param originalFile 被复制的文件
     * @param pathCopyTo   要复制到的路径 需要是一个文件夹
     * @description FileReader、Writer实现文件复制
     * @author 俊昭
     * @date 2022/4/24
     */
    public static void FileWriterReaderCopy(File originalFile, File pathCopyTo) {
        if (originalFile.isFile() && pathCopyTo.isDirectory()) {
            File newFile = new File(pathCopyTo, originalFile.getName());
            FileReader r = null;
            FileWriter w = null;

            try {
                // 创建操作的流
                r = new FileReader(originalFile);
                w = new FileWriter(newFile);
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                char cbuf[] = new char[10];
                int len = 0;
                while ((len = r.read(cbuf)) != - 1) {// 读入内存
                    // 输出原文件内容
                    w.write(cbuf, 0, len);

//                    for (int i = 0; i < len; i++) {
//                        w.write(cbuf[i]);
//                    }
                }
                System.out.println("复制成功");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {

                try {
                    if (r != null) {
                        r.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (w != null) {
                            w.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }


            }


        } else {
            throw new RuntimeException("您输入的文件或路径有误！");
        }
    }

    /**
     * 输出(写出)信息到C:\Users\Junzhao\IOStream\字符流 目录下的FileWhiter.txt文件
     * 当文件在硬盘对应路径不存在时会帮我们创建
     * 提供流时一定注意写入模式 只传入字符串是覆盖模式
     * 第二个参数的意思是是否追加写入 默认是false也就是不追加直接覆盖
     */
    @Test
    public void testFileWhiter001() {
        // 实例化file 指明要操作的文件
        File file = new File("C:\\Users\\Junzhao\\IOStream\\字符流\\FileWhiter.txt");

        // 提供具体的流
        FileWriter w1 = null;
        try {

            w1 = new FileWriter(file);
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            // 写出数据
            w1.write("I have a dream !\n");
            w1.write("You need have a dream too !");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭流
            try {
                w1.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 将C:\Users\Junzhao\IOStream\字符流 目录下的Hello.txt读入内存，并输出到控制台
     * <p>
     * 注意 一定要使用cry catch finally
     * 读入文件一定要存在 否则报File Not Found Exception异常
     */
    @Test
    public void testFileReader001() {
        // 实例化file 指明要操作的文件
        File file = new File("C:\\Users\\Junzhao\\IOStream\\字符流\\Hello.txt");

        // 提供具体的流
        FileReader r1 = null;
        try {
            r1 = new FileReader(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }


        // 读取数据
        // 读取单个字符。 返回值: 已读字符，如果到达流的末尾则为-1

        try {
            int data;
            while ((data = r1.read()) != - 1) {
                System.out.print((char) data);
            }
            /* 同以上一致 上边更简便一些
                int data = r1.read();
                while (data != -1){
                    System.out.print((char) data);
                    data = r1.read();
                }
        */
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 流的关闭 务必要加！
            try {
                if (r1 != null) {
                    r1.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
//            或者
//            if (r1 != null) {
//                try {
//                    r1.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
        }
    }

    /**
     * 对 read() 方法的使用升级 使用read()的重载方法
     * 更加规范 都逃不出以下四步
     */
    @Test
    public void testFileReader002() {
        // 实例化file 指明要操作的文件
        File file = new File("C:\\Users\\Junzhao\\IOStream\\字符流\\Hello.txt");

        // 提供具体的流
        FileReader r1 = null;
        try {
            r1 = new FileReader(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // 读取/写入数据
        try {
            char[] cbuffer = new char[5];
            int len;
            // int read(char cbuf[])
            // 将字符读入数组。该方法将阻塞，直到有输入可用、发生I/O错误或到达流的末端。
            while ((len = r1.read(cbuffer)) != - 1) {
                for (int i = 0; i < len; i++) {
                    System.out.print(cbuffer[i]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (r1 != null) {
                try {
                    r1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}
